/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mrp.beans;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import mrp.entity.GestorBaseDatos;
import mrp.entity.Insumo;
import mrp.login.Login;
import mrp.web.InsumoWeb;

/**
 *
 * @author root
 */
@ManagedBean(name="insumo")
@SessionScoped
public class InsumoBean implements Serializable{
    
    @ManagedProperty("#{usuarioBean}")
    private UsuarioBean usuarioBean;
    @ManagedProperty("#{login}")
    private Login login;
    @ManagedProperty("#{insumoweb}")
    private InsumoWeb insumoweb;
    
    private Insumo insumo;
    
    //-------------------- metodos getters and setters-----------------------
    public Insumo getInsumo() {
        return insumo;
    }
    public void setInsumo(Insumo insumo) {
        this.insumo = insumo;
    }
    public InsumoWeb getInsumoweb() {
        return insumoweb;
    }
    public void setInsumoweb(InsumoWeb insumoweb) {
        this.insumoweb = insumoweb;
    }
    public Login getLogin() {
        return login;
    }
    public void setLogin(Login login) {
        this.login = login;
    }
    public UsuarioBean getUsuarioBean() {
        return usuarioBean;
    }
    public void setUsuarioBean(UsuarioBean usuarioBean) {
        this.usuarioBean = usuarioBean;
    }
    public String getCodInsumo() {
        return this.getInsumo().getCodInsumo();
    }

    public void setCodInsumo(String codInsumo) {
        this.getInsumo().setCodInsumo(codInsumo);
    }

    public String getDigitador() {
        return this.getInsumo().getDigitador();
    }

    public void setDigitador(String digitador) {
        this.getInsumo().setDigitador(digitador);
    }

    public String getFechaCreacion() {
        return this.getInsumo().getFechaCreacion();
    }

    public void setFechaCreacion(String fechaCreacion) {
        this.getInsumo().setFechaCreacion(fechaCreacion);
    }

    public String getFechaDigitador() {
        return this.getInsumo().getFechaDigitador();
    }

    public void setFechaDigitador(String fechaDigitador) {
        this.getInsumo().setFechaDigitador(fechaDigitador);
    }

    public String getNombreInsumo() {
        return this.getInsumo().getNombreInsumo();
    }

    public void setNombreInsumo(String nombreInsumo) {
        this.getInsumo().setNombreInsumo(nombreInsumo);
    } 
    //-----------------fin metodos getters and setters-----------------------
    
    //-----------------metodos de la clase Insumo--------------------------
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
    }
    public void mostrarMensaje(String tipoMensaje,String mensaje, String detalle)
    {
        if(tipoMensaje.equals("info"))
        {
            FacesContext.getCurrentInstance().addMessage(null,new FacesMessage(FacesMessage.SEVERITY_INFO, mensaje,detalle) );   
        }else{
            if(tipoMensaje.equals("error"))
            {
                FacesContext.getCurrentInstance().addMessage(null,new FacesMessage(FacesMessage.SEVERITY_ERROR, mensaje,detalle) );   
            }else{
                if(tipoMensaje.equals("fatal"))
                {
                    FacesContext.getCurrentInstance().addMessage(null,new FacesMessage(FacesMessage.SEVERITY_FATAL, mensaje,detalle) );   
                }else{
                    if(tipoMensaje.equals("alerta"))
                    {
                        FacesContext.getCurrentInstance().addMessage(null,new FacesMessage(FacesMessage.SEVERITY_WARN, mensaje,detalle) );   
                    }
                }
            }
        }
    }    
    private boolean verificarLogin()
    {
        if(login.verificarSesionUsuario().equals(usuarioBean.getUsuario().getIdSesion()))
        {           
            return true;
        }
        else
        {
            this.mostrarMensaje("error","No está ingresado al sistema","");
            this.borrarDatos();
        }
        return false;
    }
    private void setearConexion(GestorBaseDatos gbd)
    {
        gbd.setUsuario(usuarioBean.getUsuario().getCedulaUsuario());
        gbd.setClave(usuarioBean.getUsuario().getClave());
        gbd.setBasedatos("BDEgoZapateria");
        gbd.setPuerto("5432");
        gbd.setServidor("localhost");
    }
    private void borrarDatos()
    {
        this.setDigitador(null);
        this.setFechaDigitador(null);
        this.setCodInsumo(null);
        this.setFechaCreacion(null);
        this.setNombreInsumo(null);    
    }
    public boolean ingresarInsumo()
    {
        if(this.verificarLogin())
        {
            boolean noExiste;
            
            GestorBaseDatos gbd=new GestorBaseDatos();
            this.setearConexion(gbd);
            
            //obtener fecha y hora del servidor
            List fechaList=gbd.select("SELECT TIMESTAMP WITHOUT TIME ZONE \'now\'");
            String fechaHora=(fechaList.get(0).toString());                      
            
            noExiste=(gbd.select("select codInsumo from Insumo where nombreInsumo like \'"+this.getNombreInsumo()+"\'")).isEmpty(); 
            
            if(noExiste)
            {
                List <String> datosLista= new ArrayList<String>();
                String respuestaInsert; //es la respuesta del insert si se almaceno o no los datos

                //Generacion del primary key
                this.setCodInsumo(gbd.generaCodigo("insumo", "IN"));
                datosLista.add(0,"\'"+this.getCodInsumo()+"\'");

                datosLista.add(1,"\'"+this.getNombreInsumo()+"\'");                
                datosLista.add(2,"\'"+fechaHora+"\'"); 
                
                datosLista.add(3,this.usuarioBean.getUsuario().getCodUsuario());

                datosLista.add(4,"\'"+fechaHora+"\'");

                //Almacenar datos en la tabla Insumo
                respuestaInsert=""+gbd.insert("Insumo",datosLista,true);
           
                if(respuestaInsert.equals("Registro almacenado correctamente"))
                {
                        mostrarMensaje("info","Ingresado Nuevo Insumo!","");
                        this.borrarDatos();
                        return true;
                }
                else
                {
                    mostrarMensaje("fatal","Error al almacenar los datos","");
                }                
            }
            else
            {
                this.mostrarMensaje("error","Error: El Insumo que desea ingresar ya existe","");
                this.borrarDatos();     
                return true;
            }           
        }
        return false;
    }
    public List<List> consultarInsumo()
    {   
        List<List>listaRetorno=new ArrayList<List>();
        List<Insumo>listaInsumo=new ArrayList<Insumo>();

        GestorBaseDatos gbd=new GestorBaseDatos();
        this.setearConexion(gbd);
        String query="select * from Insumo";       
        
        List<List>lista=gbd.selectVarios(query);
        for(int j=0;j<lista.size();j++)
        {
            listaInsumo.add(new Insumo(((lista.get(j)).get(0)).toString(), ((lista.get(j)).get(1)).toString(), ((lista.get(j)).get(2)).toString(), ((lista.get(j)).get(3)).toString(), ((lista.get(j)).get(4)).toString()));               
        }           
       
       System.out.println("Insumo query es"+query); 
                
        listaRetorno.add(listaInsumo);

        System.out.println("Clase Insumo el valor es"+query+" ");
        System.out.println("listaInsumo "+listaInsumo.size()+ " listaRetorno "+listaRetorno.size());
        return listaRetorno;
    }
    public boolean modificarDatosInsumo()
    {        
        if(this.verificarLogin())
        {
            boolean noExiste;
            boolean esDuplicado=false;
            
            GestorBaseDatos gbd=new GestorBaseDatos();
            this.setearConexion(gbd);
            
            //Verifica que la fecha no sea mayor a la actual
             //obtener fecha y hora del servidor
            List fechaList=gbd.select("SELECT TIMESTAMP WITHOUT TIME ZONE \'now\'");
            String fechaHora=(fechaList.get(0).toString()).substring(0,19);
            
            noExiste=(gbd.select("select codInsumo from Insumo where codInsumo = \'"+this.getCodInsumo()+"\'")).isEmpty();
            if(noExiste==false)
            {
                noExiste=false;
                try{
                    List<List> listacodInsumo=gbd.selectVarios("select codInsumo from Insumo where nombreInsumo ilike \'"+this.getNombreInsumo()+"\'");
                    System.out.println("select codInsumo from Insumo where codInsumo...... "+listacodInsumo.get(0).toString()+" "+this.getCodInsumo());
                    for(int i=0;i<listacodInsumo.size();i++)
                    {
                        if(((listacodInsumo.get(i)).get(0).toString().equals(this.getCodInsumo()))==false)
                        {
                            noExiste=true;  
                            esDuplicado=true;
                            this.mostrarMensaje("error","Error: Los datos del Insumo a actualizar está ingresado en el registro "+listacodInsumo.get(i).get(0).toString()+" ! ","");
                        }
                    }
                }
                catch(Exception e)
                {}
            }
            
            if(noExiste==false)
            {
                List <String> datosLista= new ArrayList<String>();
                String respuestaUpdate; //es la respuesta del update si se almaceno o no los datos

                datosLista.add(0,"\'"+this.getCodInsumo()+"\'");

                datosLista.add(1,"\'"+this.getNombreInsumo()+"\'");         
                datosLista.add(2,"\'"+this.getFechaCreacion()+"\'");
             
                datosLista.add(3,this.usuarioBean.getUsuario().getCodUsuario());

                datosLista.add(4,"\'"+fechaHora+"\'");

                String condicion="codInsumo=\'"+this.getCodInsumo()+"\'";

                //Almacenar datos en la tabla Insumo
                respuestaUpdate=""+gbd.update("Insumo",datosLista,condicion,true);

                //datosLista.add(,this);
                             
                if(respuestaUpdate.equals("Registro actualizado correctamente"))
                {
                    mostrarMensaje("info","Actualizado Datos de la Insumo!","");
                    this.borrarDatos(); //aqui debe retornar a la pagina de consulta de Insumo
                    return true;
                }
                else
                {
                    mostrarMensaje("fatal","Error al actualizar los datos","");//aqui debe retornar a la pagina de consulta de Insumo
                }
                    //System.out.println("personaEmpresa------ ´´´´= "+personaEmpresa);
            }
            else if(esDuplicado==false&&noExiste)
            {
                this.mostrarMensaje("error","Error: El Insumo que desea actualizar NO existe en el sistema","");
                this.borrarDatos();   //aqui debe retornar a la pagina de ingreso de Insumo  
                return true;
            }   
            else if(esDuplicado&&noExiste)
            {
                return false;
            }
        }
        return true;
    }
    public boolean eliminarInsumo(String codInsumo)
    {        
        if(this.verificarLogin())
        {
            int enSistema=-1;
            GestorBaseDatos gbd=new GestorBaseDatos();
            this.setearConexion(gbd);
            //verificar que el Insumo a eliminar no este asociada con alguna materia prima
            enSistema=Integer.parseInt((gbd.select("select count(codMateriaPrima) from MateriaPrima where  Insumo_fk= \'"+codInsumo+"\'")).get(0).toString()); 
            if(enSistema==0)            
            {
               if(gbd.delete("Insumo","codInsumo", "\'"+codInsumo+"\'",true)) return true;               
            }
            else
            {
                this.mostrarMensaje("error","Error: El Insumo que desea eliminar está asociado con uno o varias Materias Primas.","");
            }
        }
        return false;
    }
}
